'use strict';

/*
    Javascript语法本身不支持二进制数据格式，
    Node.js使用Buffer对象来对二进制数据进行封装操作。
    和Java中NIO的Buffer十分相似，在I/O操作中使用。

    Buffer在内存中的数据应该是二进制数据，但是对于没有byte类型的js来说，相当于一个大的Number数组，都是int类型。 每个int，相当于一个byte。
    Buffer是全局变量，无需使用require即可直接使用。

    Buffer数据属于堆外内存，不是由V8进行分配，所以不受V8堆内存上限的限制。
 */

Buffer;

/*
    初始化空Buffer可以使用alloc方法操作，默认填充0
    Buffer.alloc(size[, fill[, encoding]])
    Buffer.allocUnsafe(size) Unsafe方法初始化的Buffer不进行默认填充，所以默认分配的空间会存在旧的内存数据。

 */
Buffer.alloc(100);

/*
    直接创建Buffer 官方推荐使用Buffer.from方法。
    from方法支持

    字符串编码二进制 Buffer.from('str', 'utf-8')
    字符编码支持
        ascii
        utf-8
        utf16le
        ucs2 utf16le别名
        base64 这个好，这个方便
        latin1 iso-8859-1的别名
        binary latin1的别名
        hex 十六进制

    直接使用Number数组进行创建 Buffer.from([1, 2, 3]);
    每一个Number相当于一个byte，如果超过255则会溢出。
    如果是float/boolean类型的，强制转型。
    其他类型的数据按0处理。


    还可以与其他Buffer内存共享 Buffer.from(otherBuffer, offset, length)
 */

Buffer.from([2, 4, 5]);

/*
    Buffer可以使用for of语法遍历。
    Buffer对象还有values() keys() entries()方法返回iterator。
    key对应的就是数据在数组的下标。
 */
for(const b of Buffer.from([1, 2, 3.3, 257])) {
    console.log(b, typeof b);
}


/*
    Buffer的写入依赖write*方法
    write(str, offset, length, encoding) 写入字符串
    经测试如果length的长度没能完整的解析一个字符，则会被忽略。
    例如 buf.write('我', 0, 1) 。汉字『我』在utf-8下用3字节编码，而方法只写入1字节，则该字被全部忽略。

    同时还支持大量其他write方法，例如 writeInt32LE ，与write大同小异。
    这里要注意字节序的问题
    LE = Little Endian
    BE = Big Endian

    读取数据
    read*方法，与write相对应。

    toString方法支持字符串格式化的返回数据
 */

let buf = Buffer.alloc(10);
buf.write('我大爷', 0, 7);
console.log(buf);

buf.fill(0);
buf.writeInt32LE(258, 0);
console.log(buf);

buf.fill(0);
buf.writeInt32BE(258, 0);
console.log(buf, buf.readInt32BE(0), buf.readInt32LE(0));

/*
    其他方法 用的时候再去查吧
    contact 合并多个buffer
    compare
    copy
    slice
 */
